﻿#pragma once
#include <GLES3/gl3.h>

/**
VertexBuffer是底层openGL顶点缓冲区对象.
它用于保存顶点数组.
*/
class VertexBuffer
{
public:
    /**
    构造函数
    @param sizePerVertex 一个顶点的大小（以字节为单位）
    @param vertexNumber 顶点的数目
    @param usage 数据更新模式
    */
    static VertexBuffer* create(int sizePerVertex, int vertexNumber, GLenum usage = GL_STATIC_DRAW);
    /**获取一个顶点的大小（以字节为单位）*/
    int getSizePerVertex() const;
    /**获取顶点数*/
    int getVertexNumber() const;
    /**
    更新全部或部分顶点数据，如果指定的范围超过顶点缓冲区，则会对其进行剪裁
    @param verts 顶点数据的指针
    @param count 要更新的顶点数
    @param begin 要更新的起始位置
    */
    bool updateVertices(const void* verts, int count, int begin);
    /**
    获取顶点数组的字节大小，等于 getSizeServerTex() * getVertexNumber()
    */
    int getSize() const;
    /**
    获取顶点缓冲区的openGL句柄
    */
    GLuint getVBO() const;
    
    VertexBuffer();
    virtual ~VertexBuffer();

protected:
    /**
    初始化顶点缓冲区
    @param sizePerVertex 一个顶点的大小（以字节为单位）
    @param vertexNumber 顶点的数目
    @param usage 数据更新模式
    */
    bool init(int sizePerVertex, int vertexNumber, GLenum usage = GL_STATIC_DRAW);

    mutable GLuint _vbo;
    int _sizePerVertex;
    int _vertexNumber;
    GLenum _usage;
};

/**
IndexBuffer是底层openGL索引缓冲区对象.
它用来保存索引数组.
*/
class IndexBuffer
{
public:
    /**
    构造函数
    @param sizePerIndex 一个索引的大小（以字节为单位）
    @param number 索引数量
    @param usage 数据更新模式
    */
    static IndexBuffer* create(int sizePerIndex, int number, GLenum usage = GL_STATIC_DRAW);
    /**获取一个索引的大小（以字节为单位）*/
    int getSizePerIndex() const;
    /**获取索引数*/
    int getIndexNumber() const;
    /**
    更新全部或部分索引数据，如果指定的范围超过顶点缓冲区，则会对其进行剪裁
    @param indices 索引数据的指针
    @param count 要更新的索引数
    @param begin 要更新的起始位置
    */
    bool updateIndices(const void* indices, int count, int begin);
    /**
    获取索引数组的字节大小
    */
    int getSize() const;
    /**
    获取索引缓冲区的openGL句柄
    */
    GLuint getVBO() const;
    /**
    激活
    */
    void use();

    IndexBuffer();
    virtual ~IndexBuffer();

protected:
    /**
    初始化索引缓冲区
    @param sizePerIndex 一个索引的大小（以字节为单位）
    @param number 索引数量
    @param usage 数据更新模式
    */
    bool init(int sizePerIndex, int number, GLenum usage = GL_STATIC_DRAW);

    mutable GLuint _vbo;
    int _sizePerIndex;
    int _indexNumber;
    GLenum _usage;
};
